package com.openmanus.agent.core;

import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * 智能体执行结果
 * 封装智能体执行的最终结果信息
 * 
 * @author OpenManus Team
 * @version 1.0.0
 */
@Getter
@Builder
public class AgentResult {

    /**
     * 执行是否成功
     */
    private final boolean success;

    /**
     * 输出内容
     */
    private final String output;

    /**
     * 错误信息
     */
    private final String error;

    /**
     * 执行开始时间
     */
    private final LocalDateTime startTime;

    /**
     * 执行结束时间
     */
    private final LocalDateTime endTime;

    /**
     * 执行步骤数
     */
    private final int totalSteps;

    /**
     * 额外的元数据
     */
    private final Map<String, Object> metadata;

    /**
     * 创建成功结果
     * 
     * @param output 输出内容
     * @return 成功结果
     */
    public static AgentResult success(String output) {
        return AgentResult.builder()
            .success(true)
            .output(output)
            .endTime(LocalDateTime.now())
            .build();
    }

    /**
     * 创建成功结果（带元数据）
     * 
     * @param output 输出内容
     * @param metadata 元数据
     * @return 成功结果
     */
    public static AgentResult success(String output, Map<String, Object> metadata) {
        return AgentResult.builder()
            .success(true)
            .output(output)
            .metadata(metadata)
            .endTime(LocalDateTime.now())
            .build();
    }

    /**
     * 创建错误结果
     * 
     * @param error 错误信息
     * @return 错误结果
     */
    public static AgentResult error(String error) {
        return AgentResult.builder()
            .success(false)
            .error(error)
            .endTime(LocalDateTime.now())
            .build();
    }

    /**
     * 创建错误结果（带输出）
     * 
     * @param error 错误信息
     * @param output 部分输出内容
     * @return 错误结果
     */
    public static AgentResult error(String error, String output) {
        return AgentResult.builder()
            .success(false)
            .error(error)
            .output(output)
            .endTime(LocalDateTime.now())
            .build();
    }

    /**
     * 获取执行持续时间（毫秒）
     * 
     * @return 执行持续时间，如果开始时间为null则返回0
     */
    public long getDurationMillis() {
        if (startTime == null || endTime == null) {
            return 0;
        }
        return java.time.Duration.between(startTime, endTime).toMillis();
    }

    /**
     * 获取元数据值
     * 
     * @param key 键名
     * @return 元数据值
     */
    @SuppressWarnings("unchecked")
    public <T> T getMetadata(String key) {
        if (metadata == null) {
            return null;
        }
        return (T) metadata.get(key);
    }

    /**
     * 检查是否包含指定元数据
     * 
     * @param key 键名
     * @return 是否包含
     */
    public boolean hasMetadata(String key) {
        return metadata != null && metadata.containsKey(key);
    }

    /**
     * 生成结果摘要
     * 
     * @return 结果摘要
     */
    public String generateSummary() {
        StringBuilder summary = new StringBuilder();
        summary.append("执行结果: ").append(success ? "成功" : "失败").append("\n");
        
        if (success && output != null) {
            summary.append("输出: ").append(output).append("\n");
        }
        
        if (!success && error != null) {
            summary.append("错误: ").append(error).append("\n");
        }
        
        if (startTime != null && endTime != null) {
            summary.append("执行时长: ").append(getDurationMillis()).append("ms\n");
        }
        
        if (totalSteps > 0) {
            summary.append("执行步骤: ").append(totalSteps).append("\n");
        }
        
        return summary.toString();
    }

    @Override
    public String toString() {
        return generateSummary();
    }
}
